<?php
/**
 * Classe encarregada de fazer o roteamento das informações com base nos parametros enviados
 * @author cristiano
 *
 */
class Roteador {
	private static $instancia;
	private $array_parametros = array();

	/**
	 * Instancia singleton do objeto
	 *@return Roteador
	 */
	public static function GetInstancia(){
		if(!Roteador::$instancia){
			Roteador::$instancia = new Roteador();
		}

		return Roteador::$instancia;
	}

	/**
	 * executa uma série de procedimentos para validação e registros dos parametros no sistema
	 * 
	 * @return void
	 */
	public function Analisar(){
		$this->AnalisadorUrl();
		$this->Rotear();
		$this->RegistraParametros();
	}

	/**
	 * De posse do array de parametros da url, aqui é registrado todos os parametros
	 * @param $tmp_parans
	 */
	private function Rotear(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Roteador::Rotear");
		
		$sistema = Sistema::GetInstancia();
		$paginas = $sistema->GetPaginas();
		$requests = array_merge($_REQUEST, $_FILES);
		
		if(!isset($requests['page'])){
			$page = reset($this->array_parametros);
			if(!$page){
				$page = "index";
			}
		}else{
			$page = $requests['page'];
		}

		array_shift($this->array_parametros);

		foreach($paginas as $item){
			if($item->GetNome() == $page){
				StateManager::GetInstancia()->PageState()->SetValido();
				$sistema->SetValidade(true);
				$sistema->SetControleBase($item->GetControle());
				$sistema->SetPaginaAtual($item);
			}
		}

		if(!StateManager::GetInstancia()->PageState()->GetState()){
			$pagina = $sistema->GetPaginas('erro');
			$sistema->SetPaginaAtual($pagina);
			StateManager::GetInstancia()->PageState()->SetValido();
		}

		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Roteador::Rotear");
	}

	private function Secure($valor){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Roteador::Secure");

		if(is_numeric($valor)){
			$final_valor = (int)$valor;
		}else{
			$final_valor = (!is_array($valor)) ? addslashes($valor) : $valor;
		}

		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Roteador::Secure");
		return $final_valor;
	}

	/**
	 * Transforma os parametros coletados pelo Analisador de url com os parametros post e get em parametros do sistema padronizados
	 *
	 * @return void
	 */
	private function RegistraParametros(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Roteador::RegistraParametros");

		$requests = array_merge($_REQUEST, $_FILES);
		$sistema = Sistema::GetInstancia();

		foreach($requests as $chave => $valor){
			$sistema->SetParametros($chave, $this->Secure($valor));
		}

		$urlconf = $sistema->GetPaginaAtual()->GetUrlConf();
		if(!$urlconf){
			$urlconf = $sistema->GetSite()->GetUrlConf();
		}

		$tmp_array_urlconf = explode("/", $urlconf);

		foreach($tmp_array_urlconf as $urlconf){
			if($sistema->GetParametros($urlconf) == ''){
				$sistema->SetParametros($urlconf, reset($this->array_parametros));
			}
			array_shift($this->array_parametros);
		}

		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Roteador::RegistraParametros");
	}

	/**
	 * Função específicamente projetada para analisar a URL e verificar os parametros enviados,
	 * ela coletará todos os parametros seja via GET com querystring ou url amigável e registra os dados em um array para que o 
	 * roteador configure os parametros
	 */
	private function AnalisadorUrl(){
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->Start("Roteador::AnalisadorUrl");

		$uri = $_SERVER['REQUEST_URI'];
		$array_uri = explode("/", $uri);
		$ar_app_dir = explode("/", APP_FOLDER);
		$trigger = false;

		array_shift($array_uri);
		foreach($ar_app_dir as $folder){
			if($array_uri[0] == $folder){
				array_shift($array_uri);
			}
		}

		foreach ($array_uri as $item){
			array_push($this->array_parametros, $item);
		}
		
		if(Sistema::GetInstancia()->GetMedidor()) Velocimetro::GetInstancia()->End("Roteador::AnalisadorUrl");
	}
}